package com.malou.client.ventas.cambio;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelFactory;
import com.extjs.gxt.ui.client.data.BeanModelLookup;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.KeyListener;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.HiddenField;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.RowNumberer;
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyCodes;
import com.malou.client.MalouConstants;
import com.malou.client.util.Utilities;
import com.malou.client.ventas.ingresostock.IngresoStock;
import com.malou.client.ventas.modeloprenda.ModeloPrendas;

public class DevolucionPrendaDialog extends Dialog
 {
	private Button guardar;
	private Button cancelar;
	public  Status status;
	private MalouConstants constants = GWT.create(MalouConstants.class);
	
	public  TextField<String> codigodevolucion;
	public  HiddenField<String> prendadevolucion_id;
	public  ComboBox<BeanModel> prendadevolucion;
	public  NumberField cantidad_devolucion;
	public  NumberField montodevolucion;
	public  NumberField stockdevolucion;
	public  HiddenField<Double> montodev;
	
	Cambio cam;
		
	private Button delDetalle_devolucion;
	private ListStore<BeanModel> store_devolucion;
	
	public  Grid<BeanModel> grid_devolucion;

	private ToolBar toolBar_devolucion;
    
	private FormPanel panel;
	private LayoutContainer montodevolucionLayout;
	
	
	public DevolucionPrendaDialog(){
		setLayout(new FitLayout());
		setIcon(IconHelper.createPath("images/icons/undo.ico"));
		setModal(true);
		setPlain(true);
		setSize(800, 450);
		setClosable(true);
		
		ModeloPrendas.devolucionprendaDialog = this;
		
		panel = new FormPanel();		
		panel.setBorders(false);
	    panel.setBodyBorder(false);
	    panel.setPadding(5);
	    panel.setHeaderVisible(false);
	    
		montodevolucionLayout = new LayoutContainer();
		montodevolucionLayout.setStyleAttribute("padding", "8px");
		montodevolucionLayout.setStyleAttribute("paddingLeft", "450px");
		montodevolucionLayout.setStyleAttribute("marginTop", "8px");
		montodevolucionLayout.setBorders(true);
		montodevolucionLayout.setLayout(new ColumnLayout());
		
	    addFields(panel);
	    
	    setButtonAlign(HorizontalAlignment.LEFT);
	    setButtons("");
	    add(panel);
	 
	    setBodyBorder(true);	    
	    setResizable(false);	    
	    setFocusWidget(codigodevolucion);
	    	    
		setHeading(constants.devolucionPrenda());

	}
	
	private void addFields(FormPanel cp) {
	
		ModeloPrendas.autoComplete();
		ModeloPrendas.autoCompleteDevolucion();
		
	    
		FieldSet devolucionFieldSet = new FieldSet();
		devolucionFieldSet.setHeading(constants.prendaingreso());
		devolucionFieldSet.setLayout(new ColumnLayout());
		devolucionFieldSet.setStyleAttribute("marginTop", "8px");
		devolucionFieldSet.setStyleAttribute("padding", "8px");
		devolucionFieldSet.setBorders(true);

		stockdevolucion = new NumberField();
		stockdevolucion.setFieldLabel(constants.stock());
	    stockdevolucion.setWidth(20);
		stockdevolucion.setAllowNegative(false);
		stockdevolucion.setAllowBlank(false);
		stockdevolucion.setAllowDecimals(false);

		toolBar_devolucion = new ToolBar();

		store_devolucion = new ListStore<BeanModel>();
		   	
		prendadevolucion_id = new HiddenField<String>();
		
		codigodevolucion = new TextField<String>();
		codigodevolucion.setFieldLabel(constants.codigo());	
		codigodevolucion.setAllowBlank(false);
		codigodevolucion.setWidth(20);
		codigodevolucion.addKeyListener(new KeyListener(){
		public void componentKeyDown(ComponentEvent event){
			if(event.getKeyCode() == KeyCodes.KEY_ENTER){
				if(codigodevolucion.getValue() != null){
					ModeloPrendas.getPrendaDevolucion(codigodevolucion.getValue());
			     }
			   }				
			}
		});
		
		montodevolucion = new NumberField();
		montodevolucion.setFieldLabel(constants.devolver());
		montodevolucion.setWidth(20);
		montodevolucion.setAllowNegative(false);
		montodevolucion.setAllowBlank(false);
		montodevolucion.setAllowDecimals(true);
	
		montodev = new HiddenField<Double>();
		
		prendadevolucion = new ComboBox<BeanModel>();
		prendadevolucion.setFieldLabel(constants.prenda());
		prendadevolucion.setDisplayField("nombre");			 	    
		prendadevolucion.setStore(ModeloPrendas.storeAutocomplete);		
		prendadevolucion.setValueField("nombre");
		prendadevolucion.setHideTrigger(true);  
		prendadevolucion.setPageSize(10);
		prendadevolucion.setUseQueryCache(false);
		prendadevolucion.setTriggerAction(TriggerAction.ALL);
		prendadevolucion.setAllowBlank(false);
		
		prendadevolucion.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() {
			
			@Override
			public void selectionChanged(SelectionChangedEvent<BeanModel> se) {
				if(se.getSelectedItem() != null){
				codigodevolucion.setValue(se.getSelectedItem().get("codigo").toString());
				prendadevolucion_id.setValue(se.getSelectedItem().get("id").toString());
				cantidad_devolucion.setValue(1);
				//montodevolucion.setRawValue(se.getSelectedItem().get("precioventa").toString());
				montodev.setValue(Double.parseDouble(se.getSelectedItem().get("precioventa").toString()));
				stockdevolucion.setValue(Integer.parseInt(se.getSelectedItem().get("stock").toString()));
				}
			}
		});
		
		
		cantidad_devolucion = new NumberField();
		cantidad_devolucion.setFieldLabel(constants.cantidad());		
		cantidad_devolucion.setAllowNegative(false);
		cantidad_devolucion.setAllowBlank(false);
		cantidad_devolucion.setAllowDecimals(false);
		cantidad_devolucion.setPropertyEditorType(Integer.class);
		cantidad_devolucion.setMinValue(1);
		
		cantidad_devolucion.addKeyListener(new KeyListener() {

			public void componentKeyDown(ComponentEvent event) {
				if (event.getKeyCode() == KeyCodes.KEY_ENTER) {
					agregarDetalleDevolucion();
					
				}
			}
		});

		
		delDetalle_devolucion = new Button(constants.eliminar(), IconHelper.createPath("images/icons/delete.gif"));
	    delDetalle_devolucion.setEnabled(false);
	    
        SelectionListener<ButtonEvent> sl_deling;        
        sl_deling = new SelectionListener<ButtonEvent>(){
        	
        	@Override
			public void componentSelected(ButtonEvent ce) {		
				BeanModel be =grid_devolucion.getSelectionModel().getSelectedItem();
				grid_devolucion.getStore().remove(be);
			}
        };
        delDetalle_devolucion.addSelectionListener(sl_deling);
        
      
        	
		devolucionFieldSet.add(setLayout(codigodevolucion, "90%",40),	new ColumnData(.25));
		devolucionFieldSet.add(setLayout(prendadevolucion, "89%", 40),new ColumnData(.35));
		devolucionFieldSet.add(setLayout(cantidad_devolucion, "85%", 60),new ColumnData(.2));
		devolucionFieldSet.add(setLayout(stockdevolucion, "90%", 40),new ColumnData(.2));
	   
		montodevolucionLayout.add(setLayout(montodevolucion, "100%",50),	new ColumnData(.5));

			
        
        toolBar_devolucion.add(delDetalle_devolucion);
		
	        
	    ArrayList<ColumnConfig> column_devolucion = new ArrayList<ColumnConfig>();
	    
	    RowNumberer rd = new RowNumberer();
	    column_devolucion.add(rd);
	    column_devolucion.add(new ColumnConfig("codigo", constants.codigo(), 200));
	    column_devolucion.add(new ColumnConfig("prenda", constants.prenda(),300));
		column_devolucion.add(new ColumnConfig("cantidad", constants.cantidad(), 100));
		column_devolucion.add(new ColumnConfig("monto", constants.total(),100));
		       
        ColumnModel cmd = new ColumnModel(column_devolucion);       
        
        grid_devolucion = new Grid<BeanModel>(store_devolucion, cmd);
        grid_devolucion.addPlugin(rd);  
        grid_devolucion.getSelectionModel().addListener(Events.SelectionChange, new Listener<SelectionChangedEvent<BeanModel>>(){

			@Override
			public void handleEvent(SelectionChangedEvent<BeanModel> be) {				
				if(be.getSelectedItem() != null)
					delDetalle_devolucion.setEnabled(true);
				else
					delDetalle_devolucion.setEnabled(false);
			}
		});

        
        ContentPanel detalle_devolucion = new ContentPanel();
        detalle_devolucion.setHeaderVisible(false);
        detalle_devolucion.setLayout(new FitLayout());
        detalle_devolucion.setHeight(250);
        detalle_devolucion.add(grid_devolucion);
        detalle_devolucion.setTopComponent(toolBar_devolucion);        
        
        
		Component comp[]={codigodevolucion,prendadevolucion,cantidad_devolucion};
		Utilities.Enter(comp);
		
        cp.add(devolucionFieldSet);
        cp.add(detalle_devolucion);
        cp.add(montodevolucionLayout);
	}
	
	@Override
	  protected void createButtons() {
	    super.createButtons();
	    
	    if (constants == null) {
	    	constants = GWT.create(MalouConstants.class);
		}
	    
	    status = new Status();
	    status.setBusy(constants.guardando());
	    status.hide();
	    status.setAutoWidth(true);
	    getButtonBar().add(status);
	    
	    getButtonBar().add(new FillToolItem());
	    
	    cancelar = new Button(constants.cancelar());
	    
	    cancelar.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {	    	  
	    	  DevolucionPrendaDialog.this.hide();
	      }

	    });

	    guardar = new Button(constants.guardar());
	    
	    
	    guardar.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {
	    	  if(validarPrincipal()){

	    		  status.show();
	    		  getButtonBar().disable();
	    		  
	    		  List<IngresoStock> listIngreso = new ArrayList<IngresoStock>(); 
	    		  IngresoStock is; 
	    		  cam = new Cambio();
	  	    		 		  
	    		  for(BeanModel bi:store_devolucion.getModels()){
	    			  is = new IngresoStock(); 
	                  is.setModeloprenda_id(Integer.valueOf(bi.get("modeloprenda_id").toString()));
	                  is.setCantidad(Integer.valueOf(bi.get("cantidad").toString()));
	                  is.setMonto(Double.valueOf(bi.get("monto").toString()));
	            		
	    			  listIngreso.add(is);
	    		  }	    		  
	    		  cam.setMontodevolver(Double.valueOf(montodevolucion.getValue().toString()));
	    		  cam.setFecha(new Date());
	    			  
	    		  Cambios.devolucionprendaDialog = DevolucionPrendaDialog.this;
	    		  Cambios.save(cam,listIngreso);
	    	  }	    	  
	      }
	    });
	    
	    addButton(guardar);
	    addButton(cancelar);	    
	    
	  }
	

	
	public boolean validarPrincipal(){
    	boolean det = true;
		if(store_devolucion.getCount()==0){
			det = false;
			MessageBox.alert(constants.sistemaMarcocruzado(), constants.detallesRequeridos(), null);
		}
		codigodevolucion.setAllowBlank(true);
		cantidad_devolucion.setAllowBlank(true);
		montodevolucion.setAllowBlank(true);
	
		
		return det;
	}
	
	public void clearDetalle(){
	    codigodevolucion.clear();
		montodevolucion.clear();
		prendadevolucion.clear();
		cantidad_devolucion.clear();
		stockdevolucion.clear();
		montodev.clear();
	}
	
	public void clearPrincipal(){
		store_devolucion.removeAll();
		clearDetalle();
	 }
	
	public void agregarDetalleDevolucion(){
		
		 Boolean add = true;
	  if(validarIngreso()){	 
  	   if(store_devolucion.getCount() > 0 ){
  		  String pd_id = prendadevolucion_id.getValue();
  		  Integer cant_d = Integer.valueOf(cantidad_devolucion.getValue().toString());
  		  Double mont_d = montodev.getValue();
  		  
  		  String pddetalle_id;
  		  Integer cantdetalle;
  		  for(BeanModel b:store_devolucion.getModels()){
  			pddetalle_id = b.get("modeloprenda_id").toString();
  			  
  			  if(pddetalle_id.equals(pd_id)){
  				  
  				  add = false;	    				
  				  cantdetalle = b.get("cantidad");
  				  store_devolucion.getRecord(b).set("cantidad", cantdetalle+cant_d);
  				  store_devolucion.getRecord(b).set("monto", Integer.parseInt(b.get("cantidad").toString())*mont_d);
  				  store_devolucion.commitChanges();
  				  clearDetalle();
  				  codigodevolucion.focus();
  				  break;
  			  }
  		  }
	
  	  }
		if(add){
			      IngresoStock is = new IngresoStock();
			      is.setModeloprenda_id(Integer.valueOf(prendadevolucion_id.getValue()));
			      is.setCantidad(cantidad_devolucion.getValue().intValue());
			      is.setMonto(montodev.getValue());
			      is.setPrenda(prendadevolucion.getRawValue());
			      is.setCodigo(codigodevolucion.getValue());
				  
		    	  BeanModelFactory beanModelFactory =  BeanModelLookup.get().getFactory(is.getClass());
		    	  store_devolucion.add(beanModelFactory.createModel(is));
		    	  clearDetalle();
	    	      codigodevolucion.focus();
 	   }
	calcularMontoDevolucion();
		
	  }	
	}
	
	public void calcularMontoDevolucion(){
	  Double mi=0.0;	
	
		for(BeanModel d:store_devolucion.getModels()){
			mi += Double.parseDouble(d.get("monto").toString());	  		  
	     }
		montodevolucion.setValue(mi);
	}
         
      public Boolean validarIngreso(){
    	  boolean cd  = codigodevolucion.isValid();
    	  boolean pd  = prendadevolucion.isValid();
    	  boolean cnd = cantidad_devolucion.isValid();
    	 // boolean md  = montodevolucion.isValid();
    	  
    	return cd&&pd&&cnd;//&&md;
      }
      
	
	  private LayoutContainer setLayout(Component comp, String porcentaje,Integer withlabel) {
			LayoutContainer layout = new LayoutContainer();
			FormLayout fl = new FormLayout(LabelAlign.LEFT);
			fl.setLabelWidth(withlabel);
			layout.setLayout(fl);
			layout.add(comp, new FormData(porcentaje));

			return layout;
		}
  }
